gdk: Fix invalidation w/ pixel cache when changing child window geometry.
authorAlexander Larsson <alexl@redhat.com>
Mon, 9 Nov 2015 14:14:57 +0000 (15:14 +0100)
committerAlexander Larsson <alexl@redhat.com>
Mon, 9 Nov 2015 16:06:00 +0000 (17:06 +0100)
When moving/scrolling a child window we can't use the current clip
region to limit what is invalidated, because there may be a pixel
cache that listens for changes outside the clip region. Instead
invalidate the entire area and rely on the invalidation code to limit
the repaint to the actually visible area.

gdk/gdkwindow.c

index 9206ead6712306eb65b2778fd992c71e262a137d..7e2dfb72c3641fd5fda4cb9039a704cce64270eb 100644 (file)
@@ -5761,11 +5761,16 @@ gdk_window_move_resize_internal (GdkWindow *window,
   if (gdk_window_is_viewable (window) &&
       !window->input_only)
     {
+      GdkRectangle r;
+
       expose = TRUE;
 
-      old_region = cairo_region_copy (window->clip_region);
-      /* Adjust regions to parent window coords */
-      cairo_region_translate (old_region, window->x, window->y);
+      r.x = window->x;
+      r.y = window->y;
+      r.width = window->width;
+      r.height = window->height;
+
+      old_region = cairo_region_create_rectangle (&r);
     }
 
   /* Set the new position and size */
@@ -5801,9 +5806,14 @@ gdk_window_move_resize_internal (GdkWindow *window,
 
   if (expose)
     {
-      new_region = cairo_region_copy (window->clip_region);
-      /* Adjust region to parent window coords */
-      cairo_region_translate (new_region, window->x, window->y);
+      GdkRectangle r;
+
+      r.x = window->x;
+      r.y = window->y;
+      r.width = window->width;
+      r.height = window->height;
+
+      new_region = cairo_region_create_rectangle (&r);
 
       cairo_region_union (new_region, old_region);
 
@@ -5940,7 +5950,7 @@ gdk_window_scroll (GdkWindow *window,
 
   move_native_children (window);
 
-  gdk_window_invalidate_region_full (window, window->clip_region, TRUE);
+  gdk_window_invalidate_rect_full (window, NULL, TRUE);
 
   _gdk_synthesize_crossing_events_for_geometry_change (window);
 }